<?php
/**
 * Classe gérant la connexion à la base de donnée
 * @version 0.1
 * @author Jonathan Rotini <jonathan.rotini@gmail.com>
 * @Copyright Copyleft
 * @license GNU/GPL
 * @abstract
 * FIXME Ne marche plus depuis transition en API
 */
class ExtendException extends Exception
{
        /**
         * le type d'output ou faire ressortir l'erreur
         * @access protected
         * @var string
         */
        protected $_output_type;
    /**
     * Constructeur de la classe, permet d'initialiser tous les donnée membres de la classe
     * @since 0.1
     * @access public
     * @param Observer $obs
     * @return void
     */
    public function __construct($message, $code)
    {
        parent::__construct($message, $code);
        $tmp_output = defined("OUTPUT_ERROR_FORMAT") ? OUTPUT_ERROR_FORMAT : "log";
        $this->_output_type = array_unique(explode("|", $tmp_output));
    }
    /**
     * Destructeur de la classe, libére toutes les ressources de l'objet
     * @since 0.1
     * @access public
     * @param void
     * @return void
     */
    public function __destruct()
    {
        unset($_type);
    }
        /**
     * Report l'erreur selont le(s) mode(s) de sortie definit dans le fichier de configuration par la constant OUTPUT_ERROR_FORMAT
     * @since 0.1
     * @access public
     * @param Object $object
     * @return void
     */
        public function report(Object $object = null)
        {
                try
                {
                        foreach( $this->_output_type as $output)
                        {
                                switch ($output)
                                {
                                        case "log":
                                                $this->reportInLog();
                                        break;
                                        case "db":
                                                
                                        break;
                                }
                        }
                }
                catch(Exception $e)
                {
                        if( ERROR_MANAGEMENT_TYPE == "prod")    
                                header("Location: ".BASE_PATH."/error/error.html" );
                }
        }
        /**
     * Report l'erreur selont le(s) mode(s) de sortie definit dans le fichier de configuration par la constant OUTPUT_ERROR_FORMAT
     * @since 0.1
     * @access public
     * @param Format $f
     * @return void
     */
        protected function reportInLog()
        {
                $error = "Catch in ".$this->getFile()." at line ".$this->getLine()." ".$this->getMessage().". Error code : ".$this->getCode();
                $i = 0;
                foreach($this->getTrace() as $trace )
                        $error .= "\n#".$i++." ".$trace["class"].":".$trace["function"]."() in ".$trace["file"]." at line ".$trace["line"];
                $fp = fopen(PATH_LOG, 'a');
                $f = new FormatForLog($error);
                fwrite($fp, $f->format());
                fclose($fp);
                unset($f, $error, $fp);
        }
        /**
         * report l'exception en base de données
         */
        protected function reportInDB()
        {
                
        }
    /**
     * permet d'afficher une exception
     */
        public function printException(Format $f = null)
        {
                $content = $this->getMessage()."\n";
                $content .= "File : ".$this->getFile()."(".$this->getLine().")\n";
                $content .= $this->getTraceAsString()."\n";
                if($f instanceof Format)
                {
                        $f->setData($content);
                        $content = $f->format($content);
                }
                return $content;
        }
}
?>
